Slient Blog

RxJava RxBus基础

2017-03-13

RxBus是什么?

一个基于RxJava的事件总线,我们可以使用它来进行组件,模块之间的“复杂”通信,线程之间的数据传递,减少广播的使用和接口的回调。

为什么要使用?

代码量的精干简练

关于RxBus和EventBus的讨论
其实EventBus用起来还是很得心应手的,但是项目中都是用的RxJava,不用继续导入依赖,基本上可以达到相同的效果,何乐而不为。

Otto的主页上有这么一句话(作为竞争对手的肯定):

This project is deprecated in favor of RxJava and RxAndroid. These projects permit the same event-driven programming model as Otto, but they’re more capable and offer better control of threading.
If you’re looking for guidance on migrating from Otto to Rx, this post is a good start.

该项目已被RxJava和RxAndroid取代。Rx类项目允许与Otto类似的事件驱动编程模型,而且能力更强,操作线程更方便。
如果你正在寻找从Otto迁移到Rx的指导,这个帖子是个很好的开始。

怎么做到的呢?

其中最重要的部分要属Subject这个对象,我们来看看它为何方神物

1
public abstract class Subject<T, R> extends Observable<R> implements Observer<T>

震惊ing,竟然继承了被观察者,又实现了观察者。既能发送数据又能接受数据,简直不能再适合做事件传递者,但是在不同的线程中调用它会为造成顺序紊乱问题,给Subject的结果增加了不确定性。因此我们把Subject转化为了SerializedSubject
去解决。 接下来看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class RxBus {
private final Subject<Object,Object>_bus=new SerializedSubject<>(PublishSubject.create());;
private RxBus(){
}
private static class RxBusHolder{
private static final RxBus INSTANCE=new RxBus();
}
public static RxBus getInstance(){
return RxBusHolder.INSTANCE;
}
public void send(Object o){_bus.onNext(o);}
public Observable<Object>toObserverable(){
return _bus;
}
public boolean hasObservers(){
return _bus.hasObservers();
}
}

这个时候你可能会问如果我在不同的组件中发生了不同的message那么怎么去区别他们呢?这个很简单我们,我们只需要修改toObserverable()方法,让他去分辨不同的message,让Subject转化成不同类型的Observable,然后分别处理就ok了。

1
2
3
4
5
// 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public <T> Observable<T> toObserverable(Class<T> eventType) {
return _bus.ofType(eventType);
}

具体使用

在指定的位置订阅关系去接收数据

1
2
3
4
5
6
7
8
RxBus.getInstance()
.toObserverable(UserBean.class)
.subscribe(new Action1<UserBean>() {
@Override
public void call(UserBean userBean) {
Log.i("UserBean","success get");
}
});

在指定的位置发送数据

1
2
3
4
5
6
7
8
RxView.clicks(view)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
RxBus.getInstance().send(new UserBean("hello","sent message"));
Log.i("UserBean","message send");
}
});

重要的事情说一遍“必须先有订阅的产生再有事件的发送,可以是任何地方,但是顺序不能颠倒”

小小的结合了一下RxBinding,有没有很优美~以上就是最基本的使用方法,下一篇文章将会写如何解决RxJava中的内存泄漏问题。see you~

Tags: Android
使用微信添加

若你觉得我的文章对你有帮助,请添加我为好友

扫描二维码,分享此文章